#include "usart_thread.h"
#include "usart.h"
#include "malloc.h"
#include "JA_Protocol.h"
#include "command.h"
#define UART3_DMA_RX_BUF_SIZE 100
uint8_t UART3_DMA_RX_BUF[UART3_DMA_RX_BUF_SIZE]; //串口DMA接收缓存

#define UART3_DMA_TX_BUF_SIZE 100
uint8_t UART3_DMA_TX_BUF[UART3_DMA_RX_BUF_SIZE]; //串口DMA接收缓存

JA_Protocol_TCB ja_tcb; //JA 协议控制块
#define JA_Protocol_MAX_SIZE 300
uint8_t JA_Protocol_BUF[JA_Protocol_MAX_SIZE]; //JA 协议缓存

void Uart2_SendTask(void *p_arg);// 任务函数
void USART2_SendRecSignal(void);
void USART2_AwaitRecSignal(void);
bool USART2_DMASendData(uint8_t *data,uint8_t len);

bool USART3_DMASendData(uint8_t *data,uint8_t len);


rt_mq_t Uart_Receive_mq = RT_NULL;         //串口2接收信号量
rt_sem_t Uart_SendComplete_sem = RT_NULL;    //串口2发送完成中断信号量


rt_mq_t  Usart_send_mq=RT_NULL;         //串口2发送消息队列

extern Mallco_dev mallco_dev; //内存管理器

bool UART3SendData(uint8_t *data, uint8_t len);

void Usart3_Receive(uint8_t *buf,uint16_t len)
{
	JA_StatusTypeDef res;
	JA_BytesArray reply_buf;
	for(uint16_t i=0;i<len;i++)
	{
		res=JA_Decode(&ja_tcb,buf[i],&reply_buf);
	  if(res==JA_Decode_OK)
	  {
			if(reply_buf.len)
			{
				UART3SendData(reply_buf.bytes, reply_buf.len);
			  myfree(&mallco_dev, reply_buf.bytes);
		  }
	  }
	}
}
/*************************
 * 功能：接收线程入口函数
*************************/
void Usart_Receive_thread_entry(void *paremeter)
{
  SerialData_t data;
    Uart_Receive_mq=rt_mq_create("uart_receive_mq",      //消息队列名称
	                               sizeof(SerialData_t),                   //消息最大长度
	                               10,                   //队列长度
	                               RT_IPC_FLAG_FIFO      //等待的方式
	                               );
	JA_Create(&ja_tcb,JA_MotorParse,JA_Protocol_BUF,JA_Protocol_MAX_SIZE);
	HAL_UARTEx_ReceiveToIdle_DMA(&huart3,UART3_DMA_RX_BUF,UART3_DMA_RX_BUF_SIZE);
  while(1)
  {
		if (rt_mq_recv(Uart_Receive_mq, &data, sizeof(data), RT_WAITING_FOREVER) == RT_EOK)
		{
			if(data.usart_id==ZY_USART3)
			{
				Usart3_Receive(data.data,data.len);
			}
			myfree(&mallco_dev,data.data);
		}
  }
}
/**********************
 * 功能：发送线程入口函数
***********************/
void Usart_Send_thread_entry(void *paremeter)
{
	SerialData_t data;
	Usart_send_mq=rt_mq_create("uart_send_mq",      //消息队列名称
	                              sizeof(SerialData_t),                   //消息最大长度
	                              20,                   //队列长度
	                             RT_IPC_FLAG_FIFO      //等待的方式
	                             );
	Uart_SendComplete_sem = rt_sem_create("Uart_sendComplete", 0, RT_IPC_FLAG_PRIO);     //创建串口数据接收信号量
  while(1)
  {
		 if (rt_mq_recv(Usart_send_mq, &data, sizeof(data), RT_WAITING_FOREVER) == RT_EOK)
		 {
			 if(data.usart_id==ZY_USART3)
			 {
				  USART3_DMASendData(data.data,data.len);
			 }
			 rt_sem_take(Uart_SendComplete_sem, 200);
			 myfree(&mallco_dev,data.data);
		 }
    }
}


__weak void Usart3_RxCallback(uint8_t *data, uint8_t Size)
{
}
/********************************
 * 功能：串口2DMA发送数据
 * 参数：
 *         *data:数据
 * 返回：无
********************************/
bool USART3_DMASendData(uint8_t *data,uint8_t len)
{
	  mymemcpy(UART3_DMA_TX_BUF,data,len);
    HAL_UART_Transmit_DMA(&huart3, UART3_DMA_TX_BUF, len);
}


/************************************
 *功能：串口接收中断回调函数
 *参数：
 *      huart:串口号
 *      size：数据长度
************************************/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	SerialData_t serial_data;
	if(huart==&huart3)
	{
			serial_data.data=(uint8_t *)mymalloc(&mallco_dev,Size);
			if(serial_data.data)
		  {
			 mymemcpy(serial_data.data,UART3_DMA_RX_BUF,Size);
			 serial_data.len=Size;
			 serial_data.usart_id=ZY_USART3;
			 if(rt_mq_send(Uart_Receive_mq, &serial_data, sizeof(SerialData))!=RT_EOK)
			 {
				myfree(&mallco_dev,serial_data.data);
			 }
		  }
		  HAL_UARTEx_ReceiveToIdle_DMA(huart,UART3_DMA_RX_BUF,UART3_DMA_RX_BUF_SIZE);
	}
}
/*******************************
 * 功能：串口发送完成回调函数
 * 参数：
 *         huart:串口句柄
 * 返回：
 * ****************************/
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart == &huart3)
    {
			rt_sem_release(Uart_SendComplete_sem); //释放接收到数据信号量
    }
}

/***********************************
*功能：串口3发送数据
*参数：
*				*buf：发送数据指针
*        len：数据长度
***********************************/
bool UART3SendData(uint8_t *data, uint8_t len)
{
  SerialData_t serial_data;
  serial_data.data = (uint8_t *)mymalloc(&mallco_dev, len);
	serial_data.usart_id=ZY_USART3;
	if(serial_data.data)
	{
		mymemcpy(serial_data.data,data,len);
		serial_data.len=len;
		if(rt_mq_send(Usart_send_mq, &serial_data, sizeof(SerialData_t))!=RT_EOK)
		{
			myfree(&mallco_dev,serial_data.data);
			return false;
		}
		return true;
	}
	return false;
}

